package auth

import (
	m "admin/models/auth"
	"github.com/gin-gonic/gin"
	"gitlab.jkluck.vip/casino/golang/ca-common-util/library/log"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

// RoleMenuRepoInterface 角色菜单关联仓库接口
type RoleMenuRepoInterface interface {
	AddMenusToRole(ctx *gin.Context, roleID int64, menusID []int64) error
	RemoveMenusFromRole(ctx *gin.Context, roleID int64, menusID []int64) error
	GetMenusByRole(roleID int64) ([]m.Menu, error)
}

// RoleMenuRepo 基于GORM的角色菜单关联仓库实现
type RoleMenuRepo struct {
	db *gorm.DB
}

// NewGormRoleMenuRepository 创建基于GORM的角色菜单关联仓库实例
// db: GORM数据库连接
// 返回值: 角色菜单关联仓库实例指针
func NewRoleMenuRepo(db *gorm.DB) *RoleMenuRepo {
	return &RoleMenuRepo{db: db}
}

// AddMenusToRole 给角色添加菜单
// roleID: 角色ID
// menuID: 菜单ID
// 返回值: 错误信息
func (r *RoleMenuRepo) AddMenusToRole(ctx *gin.Context, roleID int64, menusID []int64) error {
	// 批量处理 需要操作的权限
	var roleMenus []m.RoleMenu
	for _, menuID := range menusID {
		roleMenus = append(roleMenus, m.RoleMenu{
			RoleID: roleID,
			MenuID: menuID,
		})
	}
	// 一次操作插入
	if err := r.db.Create(&roleMenus).Error; err != nil {
		log.InfoCtx(ctx, "AddMenusToRole", zap.Error(err))
		return err
	}
	return nil
}

// RemoveMenusFromRole 从角色移除菜单
// roleID: 角色ID
// menuID: 菜单ID
// 返回值: 错误信息
func (r *RoleMenuRepo) RemoveMenusFromRole(ctx *gin.Context, roleID int64, menusID []int64) error {
	var roleMenus []m.RoleMenu
	for _, menuId := range menusID {
		roleMenus = append(roleMenus, m.RoleMenu{
			RoleID: roleID,
			MenuID: menuId,
		})
	}
	if err := r.db.Where("role_id = ?", roleID).Delete(&roleMenus).Error; err != nil {
		log.InfoCtx(ctx, "RemoveMenuFromRole", zap.Error(err))
		return err
	}
	return nil
}

// GetMenusByRole 获取角色的所有菜单
// roleID: 角色ID
// 返回值: 菜单列表和错误信息
func (r *RoleMenuRepo) GetMenusByRole(roleID int64) ([]m.Menu, error) {
	var menus []m.Menu
	// 通过角色菜单关联表查询角色的所有菜单
	err := r.db.
		Table("menus").
		Joins("JOIN role_menus ON menus.id = role_menus.menu_id").
		Where("role_menus.role_id = ?", roleID).
		Find(&menus).Error
	return menus, err
}
